Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -70,6 +70,7 @@ public class Settings {
public String typescriptVersion = "^2.4";
public boolean displaySerializerWarning = true;
public boolean disableJackson2ModuleDiscovery = false;
public boolean useJackson2RequiredForOptional = false;
public ClassLoader classLoader = null;

private boolean defaultStringEnumsOverriddenByExtension = false;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,13 @@ private BeanModel parseBean(SourceType<Class<?>> sourceClass) {
continue;
}
}

boolean optional = false;

if (settings.useJackson2RequiredForOptional) {
optional = ! beanPropertyWriter.isRequired();
}

for (Class<? extends Annotation> optionalAnnotation : settings.optionalAnnotations) {
if (beanPropertyWriter.getAnnotation(optionalAnnotation) != null) {
optional = true;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,18 @@

package cz.habarta.typescript.generator;

import cz.habarta.typescript.generator.parser.*;
import com.fasterxml.jackson.annotation.*;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.JsonSubTypes;
import com.fasterxml.jackson.annotation.JsonTypeInfo;
import com.fasterxml.jackson.annotation.JsonTypeName;
import cz.habarta.typescript.generator.parser.BeanModel;
import cz.habarta.typescript.generator.parser.Jackson2Parser;
import cz.habarta.typescript.generator.parser.Model;
import org.junit.Assert;
import org.junit.Test;

import javax.xml.bind.annotation.XmlElement;


public class Jackson2ParserTest {

Expand Down Expand Up @@ -60,6 +67,24 @@ public void testTaggedUnion() {
Assert.assertEquals("Jackson2ParserTest$SubTypeDiscriminatedByName3", bean3.getDiscriminantLiteral());
}

@Test
public void testNonJacksonRequiredOptional() {
final Settings settings = new Settings();
settings.useJackson2RequiredForOptional = true;

final Jackson2Parser jacksonParser = new Jackson2Parser(settings, new DefaultTypeProcessor());

final Model model = jacksonParser.parseModel(NonJacksonRequiredOptionalBean.class);

final BeanModel bean = model.getBean(NonJacksonRequiredOptionalBean.class);

Assert.assertEquals("required", bean.getProperties().get(0).getName());
Assert.assertFalse(bean.getProperties().get(0).isOptional());

Assert.assertEquals("optional", bean.getProperties().get(1).getName());
Assert.assertTrue(bean.getProperties().get(1).isOptional());
}

static Jackson2Parser getJackson2Parser() {
final Settings settings = new Settings();
return new Jackson2Parser(settings, new DefaultTypeProcessor());
Expand Down Expand Up @@ -94,4 +119,15 @@ private static class SubTypeDiscriminatedByName2 implements ParentWithNameDiscri
private static class SubTypeDiscriminatedByName3 implements ParentWithNameDiscriminant {
}

private static class NonJacksonRequiredOptionalBean {
// Note: We use @XmlElement instead of @JsonProperty because the Jaxb annotations processing logic takes
// precedence even when there are no jaxb annotations on the members, due to what seems like a bug in
// com.fasterxml.jackson.module.jaxb.JaxbAnnotationIntrospector.hasRequiredMarker()

@XmlElement(required = true)
public String required;

@XmlElement(required = false)
public String optional;
}
}
Original file line number Diff line number Diff line change
@@ -1,13 +1,27 @@

package cz.habarta.typescript.generator.gradle;

import cz.habarta.typescript.generator.*;
import cz.habarta.typescript.generator.ClassMapping;
import cz.habarta.typescript.generator.DateMapping;
import cz.habarta.typescript.generator.EnumMapping;
import cz.habarta.typescript.generator.Input;
import java.io.*;
import java.net.*;
import java.util.*;
import org.gradle.api.*;
import org.gradle.api.tasks.*;
import cz.habarta.typescript.generator.JaxrsNamespacing;
import cz.habarta.typescript.generator.JsonLibrary;
import cz.habarta.typescript.generator.Output;
import cz.habarta.typescript.generator.Settings;
import cz.habarta.typescript.generator.StringQuotes;
import cz.habarta.typescript.generator.TypeScriptFileType;
import cz.habarta.typescript.generator.TypeScriptGenerator;
import cz.habarta.typescript.generator.TypeScriptOutputKind;
import org.gradle.api.DefaultTask;
import org.gradle.api.Task;
import org.gradle.api.tasks.TaskAction;

import java.io.File;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.List;


public class GenerateTask extends DefaultTask {
Expand Down Expand Up @@ -63,6 +77,7 @@ public class GenerateTask extends DefaultTask {
public StringQuotes stringQuotes;
public boolean displaySerializerWarning = true;
public boolean disableJackson2ModuleDiscovery;
public boolean useJackson2RequiredForOptional;
public boolean debug;

@TaskAction
Expand Down Expand Up @@ -137,6 +152,7 @@ public void generate() throws Exception {
settings.setStringQuotes(stringQuotes);
settings.displaySerializerWarning = displaySerializerWarning;
settings.disableJackson2ModuleDiscovery = disableJackson2ModuleDiscovery;
settings.useJackson2RequiredForOptional = useJackson2RequiredForOptional;
settings.classLoader = classLoader;
final File output = outputFile != null
? getProject().file(outputFile)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -409,6 +409,13 @@ public class GenerateMojo extends AbstractMojo {
@Parameter
private boolean disableJackson2ModuleDiscovery;

/**
* Use Jackson's concept of required parameters to specify optionality in the generated definition. If a property
* is not marked as required, the TypeScript property will be emitted as optional.
*/
@Parameter
private boolean useJackson2RequiredForOptional;

/**
* Turns on verbose output for debugging purposes.
*/
Expand Down Expand Up @@ -483,6 +490,7 @@ public void execute() {
settings.setStringQuotes(stringQuotes);
settings.displaySerializerWarning = displaySerializerWarning;
settings.disableJackson2ModuleDiscovery = disableJackson2ModuleDiscovery;
settings.useJackson2RequiredForOptional = useJackson2RequiredForOptional;
settings.classLoader = classLoader;
final File output = outputFile != null
? outputFile
Expand Down